from nicegui import ui
import plotly.graph_objects as go

# 存储点的列表
points = []

# 当前选中的点索引
selected_point_index = None

# 初始化 Plotly 图
fig = go.Figure()

# 更新图的函数
def update_graph():
    global fig
    fig.data = []  # 清空之前的点
    if points:
        x_vals = [p[0] for p in points]
        y_vals = [p[1] for p in points]
        z_vals = [p[2] for p in points]
        fig.add_trace(go.Scatter3d(
            x=x_vals,
            y=y_vals,
            z=z_vals,
            mode='markers',
            marker=dict(size=5),
            customdata=list(range(len(points))),  # 为每个点添加索引作为自定义数据
            hoverinfo='text',
            text=[f'点 {i+1}' for i in range(len(points))]  # 设置悬停文本
        ))
    plot.update()

# 添加点的函数
def add_point():
    try:
        x = float(x_input.value)
        y = float(y_input.value)
        z = float(z_input.value)
        points.append((x, y, z))  # 添加到点列表
        update_graph()  # 更新图
    except ValueError:
        ui.notify("请输入正确的 x, y, z 坐标.", type='negative')

# 删除点的函数
def delete_point():
    global selected_point_index
    if selected_point_index is not None and 0 <= selected_point_index < len(points):
        del points[selected_point_index]  # 删除选中的点
        selected_point_index = None  # 重置选中的点
        update_graph()  # 更新图
    else:
        ui.notify("请选择一个点进行删除.", type='negative')

# 快速添加点（+按钮）
def quick_add_point():
    try:
        x = float(x_input.value)
        y = float(y_input.value)
        z = float(z_input.value)
        points.append((x, y, z))  # 添加到点列表
        update_graph()  # 更新图
    except ValueError:
        ui.notify("请输入正确的 x, y, z 坐标.", type='negative')

# 快速删除点（-按钮）
def quick_delete_point():
    if points:
        del points[-1]  # 删除最后一个点
        update_graph()  # 更新图
    else:
        ui.notify("没有点可以删除.", type='negative')

# 点击图中点的回调函数
def on_click(trace, points, state):
    global selected_point_index
    if points:
        selected_point_index = points[0]['customdata']  # 获取选中的点的索引
        ui.notify(f"选中了点 {selected_point_index + 1}", type='positive')

# 创建 NiceGUI 界面
with ui.card():
    with ui.row():
        x_input = ui.input(label="X", placeholder="输入 x 坐标")
        y_input = ui.input(label="Y", placeholder="输入 y 坐标")
        z_input = ui.input(label="Z", placeholder="输入 Z 坐标")
    with ui.row():
        ui.button("添加点", on_click=add_point)
        ui.button("删除选中的点", on_click=delete_point)
        ui.button("+", on_click=quick_add_point).props('icon=add')
        ui.button("-", on_click=quick_delete_point).props('icon=remove')

# 显示图
plot = ui.plotly(fig).classes('w-full h-96')
plot.on('plotly_click', on_click)  # 绑定点击事件

# 启动 NiceGUI 应用
ui.run()